[プレビュー]BigQueryのData Transfer ServiceでMySQLと連携できるようになったので試してみた

[プレビュー]BigQueryのData Transfer ServiceでMySQLと連携できるようになったので試してみた

Clock Icon2025.01.19

概要

2025年1月17日のアップデートで、BigQueryのData Transfer ServiceでMySQLからデータを取り込むことができるようになりました。
https://cloud.google.com/release-notes#January_17_2025

他にもPostgreSQLにも対応したとのことです。
今回の記事では早速Data Transfer Serviceを用いてCloud SQLのMySQLインスタンスからデータを取り込んでみました。

Cloud SQL以外にもオンプレミス、AWS、Azureなど他のパブリッククラウドのインスタンスもサポートするとのことです。

It supports MySQL instances that are hosted in your on-premises environment, in Cloud SQL, and in other public cloud providers such as Amazon Web Services (AWS) and Microsoft Azure.

まずは制限事項の確認

試す前に、Data Transfer ServiceでMySQLからデータを取り込む場合は制限事項があるのでそれに触れます。
制限事項は以下の2つが記載されていました。

  • The maximum number of simultaneous connections to a MySQL database is determined by the MySQL configuration parameter max_connections. By default, this is set to 151 connections, but it can be configured to a higher limit as needed. As a result, the number of simultaneous transfer runs to a single MySQL database is limited to that maximum amount. This limitation also means that the number of concurrent transfer jobs should be limited to a value less than the maximum number of concurrent connections supported by the MySQL database.
    MySQLデータベースへの同時接続の最大数は、MySQLの設定パラメータmax_connectionsによって決定されます。デフォルトでは151接続に設定されていますが、必要に応じてより高い上限に設定することができます。その結果、1つのMySQLデータベースへの同時転送実行の数は、その最大値に制限されます。この制限は、MySQLデータベースがサポートする同時接続の最大数よりも少ない値に、同時転送ジョブの数を制限する必要があることも意味します。
  • In MySQL, some data types get mapped to the string type in BigQuery to avoid any data loss. For example, numeric types defined in MySQL that don't have a defined precision and scale are mapped to the string type in BigQuery.
    MySQLでは、データ損失を回避するために、一部のデータ型がBigQueryの文字列型にマッピングされます。例えば、MySQLで定義された精度とスケールが指定されていない数値型は、BigQueryの文字列型にマッピングされます。

接続数に関しては、Data Transfer Serviceを使用しない場合でも考慮が必要な事項かと思いますので特に違和感はないと思います。
注意すべきは後者のデータ型に関する点だと思います。リファレンスにMySQLとBigQueryのデータ型がどのようにマッピングされるか記載があるので押さえておくべきと考えます。
https://cloud.google.com/bigquery/docs/mysql-transfer#data_type_mapping

リファレンスのままですが、以下にデータ型のマッピングを記載しました。

データ型のマッピング

MySQLデータ型 BigQueryデータ型
BIT BOOLEAN
TINYINT INTEGER
BOOL, BOOLEAN BOOLEAN
SMALLINT INTEGER
MEDIUMINT INTEGER
INT, INTEGER INTEGER
BIGINT BIGNUMERIC
FLOAT FLOAT
DOUBLE FLOAT
DECIMAL BIGNUMERIC
DATE DATE
DATETIME TIMESTAMP
TIMESTAMP TIMESTAMP
TIME TIME
YEAR DATE
CHAR STRING
VARCHAR STRING
BINARY BYTES
VARBINARY BYTES
TINYBLOB BYTES
TINYTEXT STRING
BLOB BYTES
TEXT STRING
MEDIUMBLOB BYTES
MEDIUMTEXT STRING
LONGBLOB BYTES
LONGTEXT STRING
ENUM STRING
SET STRING

やってみる

前提条件

  • Cloud SQL MySQLインスタンスが作成済みであること
  • プライベートIPを持ったプライベートサービスアクセスが有効になっているCloud SQL MySQLインスタンスがあること
  • MySQLインスタンスにアクセスできるネットワークアタッチメントが作成済みであること

ネットワークアタッチメントの作成に関しては以下をご参照ください
https://cloud.google.com/vpc/docs/create-manage-network-attachments?hl=ja

連携用のテーブルを作成する

データ型のマッピングが設定されるかどうかもみたいので、MySQLデータ型とBigQueryデータ型が異なるデータ型をもつテーブルを作成します。

CREATE TABLE test_data_types (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bool_col BOOLEAN,
    int_col INT,
    bigint_col BIGINT,
    float_col FLOAT,
    double_col DOUBLE,
    datetime_col DATETIME,
    timestamp_col TIMESTAMP,
    year_col YEAR,
    char_col CHAR(10),
    varchar_col VARCHAR(50),
    blob_col BLOB
);

テーブルを作成したら、データを投入します。

INSERT INTO test_data_types (
    bool_col, int_col, bigint_col, float_col, double_col, 
    datetime_col, timestamp_col, year_col, char_col, varchar_col, blob_col
) VALUES
    (
        FALSE,
        -456,
        1234567890123456789,
        0.0,
        -98765.4321,
        '2000-01-01 00:00:00',
        '1970-01-01 00:00:01',
        1999,
        'Test',
        'Another VARCHAR example.',
        'Another BLOB data'
    ),
    (
        TRUE,
        0,
        -9223372036854775808,
        3.14159,
        2.718281828459045,
        '2023-12-31 23:59:59',
        CURRENT_TIMESTAMP,
        2025,
        'A',
        'This is a longer VARCHAR example with more text.',
        'Sample binary data for BLOB'
    ),
    (
        TRUE,
        123,
        9223372036854775807,
        123.45,
        123456.789,
        '2023-10-01 12:34:56',
        CURRENT_TIMESTAMP,
        2023,
        'A',
        'This is a VARCHAR example.',
        'Sample BLOB data'
    );

INSERTしたらData Transfer Serviceの設定に移ります。

Data Transfer Serviceを設定する

GUIで設定してみました。
BigQueryコンソールのデータ転送 > 転送を作成を押下します。
スクリーンショット 2025-01-19 0.35.10.png
ソースタイプでMySQLを選択します(恐らく、以前はこの項目はなかったはず・・・)。
スクリーンショット 2025-01-19 0.37.32.png
データソースの詳細を設定します。
スクリーンショット 2025-01-19 0.41.00.png

主な設定項目としては以下です。

設定項目 設定値
ネットワークアタッチメント ネットワークアタッチメント名
Host IPアドレスまたはホスト名
Port Number ポート番号(デフォルトは3306)
Database Name 連携対象テーブルのあるDB名
Username Data Transfer Serviceが連携に使用するユーザ名
Password パスワード
Encryption Mode 暗号化有無。FULLまたはDISABLE
MySQL objects to transfer 連携対象テーブル名。表記形式は DB名/テーブル名

設定できたら実行します。連携に成功すると転送実行が正常に完了しました。と表示されます。
スクリーンショット 2025-01-19 0.50.56.png

BigQueryに連携されたテーブルを確認してみます。
スクリーンショット 2025-01-19 0.48.31.png

無事テーブルが連携できていました。
※BigQuery側でテーブルを事前に作成してはいません。自動でテーブルが作成されました。

MySQLのテーブル定義のデータ型とBigQueryのテーブル定義のデータ型を対比してみます。

フィールド名 MySQLのデータ型 BigQueryの種類
id INT INTEGER
bool_col BOOLEAN BOOLEAN
int_col INT, INTEGER
bigint_col BIGINT BIGNUMERIC
float_col FLOAT FLOAT
double_col DOUBLE FLOAT
datetime_col DATETIME TIMESTAMP
timestamp_col TIMESTAMP TIMESTAMP
year_col YEAR DATE
char_col CHAR STRING
varchar_col VARCHAR STRING
blob_col BLOB BYTES

上記より、リファレンスのマッピング表通りの変換が行われていることが確認できました。
https://cloud.google.com/bigquery/docs/mysql-transfer#data_type_mapping

テーブルのレコードも入っているか確認します。
スクリーンショット 2025-01-19 1.00.00.png

さらっと見ただけですが問題なくデータ連携されていました。

削除して連携してみる

テーブルのデータを全レコード削除して連携してみます。

DELETE FROM test_data_types;
Query OK, 3 rows affected (0.06 sec)

BigQueryのテーブルも全レコード削除されていました。
スクリーンショット 2025-01-19 1.20.31.png
どうやら洗い替えている様子。

所感

MySQLのテーブルデータをそのまま取り込みたい場合にとても手軽な方法だなと思いました。ただしMySQLとBigQueryのデータ型の違いがあるのでこれは連携時には注意した方が良いですね。GAになるのが楽しみです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.